From f64647077f1d7ebf63a497c2f87862ef37aeb570 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 28 Aug 2011 21:20:53 -0400 Subject: [PATCH] Add an accessor for grid children This addresses concerns in bug 634136. --- docs/reference/gtk/gtk3-sections.txt | 1 + gtk/gtk.symbols | 1 + gtk/gtkgrid.c | 36 ++++++++++++++++++++++++++++ gtk/gtkgrid.h | 3 +++ tests/testgrid.c | 35 +++++++++++++++++---------- 5 files changed, 64 insertions(+), 12 deletions(-) diff --git a/docs/reference/gtk/gtk3-sections.txt b/docs/reference/gtk/gtk3-sections.txt index 2cc0722e57..aca18e9a2d 100644 --- a/docs/reference/gtk/gtk3-sections.txt +++ b/docs/reference/gtk/gtk3-sections.txt @@ -6988,6 +6988,7 @@ GtkGrid gtk_grid_new gtk_grid_attach gtk_grid_attach_next_to +gtk_grid_get_child_at gtk_grid_insert_row gtk_grid_insert_column gtk_grid_insert_next_to diff --git a/gtk/gtk.symbols b/gtk/gtk.symbols index 9a42c01074..8fe844a621 100644 --- a/gtk/gtk.symbols +++ b/gtk/gtk.symbols @@ -1114,6 +1114,7 @@ gtk_grab_get_current gtk_grab_remove gtk_grid_attach gtk_grid_attach_next_to +gtk_grid_get_child_at gtk_grid_get_column_homogeneous gtk_grid_get_column_spacing gtk_grid_get_row_homogeneous diff --git a/gtk/gtkgrid.c b/gtk/gtkgrid.c index 20ec688294..cfb21f41ba 100644 --- a/gtk/gtkgrid.c +++ b/gtk/gtkgrid.c @@ -1479,6 +1479,42 @@ gtk_grid_attach_next_to (GtkGrid *grid, grid_attach (grid, child, left, top, width, height); } +/** + * gtk_grid_get_child_at: + * @grid: a #GtkGrid + * @left: the left edge of the cell + * @top: the top edge of the cell + * + * Gets the child of @grid whose area covers the grid + * cell whose upper left corner is at @left, @top. + * + * Returns: the child at the given position, or %NULL + * + * Since: 3.2 + */ +GtkWidget * +gtk_grid_get_child_at (GtkGrid *grid, + gint left, + gint top) +{ + GtkGridPrivate *priv = grid->priv; + GtkGridChild *child; + GList *list; + + for (list = priv->children; list; list = list->next) + { + child = list->data; + + if (CHILD_LEFT (child) <= left && + CHILD_LEFT (child) + CHILD_WIDTH (child) > left && + CHILD_TOP (child) <= top && + CHILD_TOP (child) + CHILD_HEIGHT (child) > top) + return child->widget; + } + + return NULL; +} + /** * gtk_grid_insert_row: * @grid: a #GtkGrid diff --git a/gtk/gtkgrid.h b/gtk/gtkgrid.h index 99f9e4e300..491ba22321 100644 --- a/gtk/gtkgrid.h +++ b/gtk/gtkgrid.h @@ -79,6 +79,9 @@ void gtk_grid_attach_next_to (GtkGrid *grid, GtkPositionType side, gint width, gint height); +GtkWidget *gtk_grid_get_child_at (GtkGrid *grid, + gint left, + gint top); void gtk_grid_insert_row (GtkGrid *grid, gint position); void gtk_grid_insert_column (GtkGrid *grid, diff --git a/tests/testgrid.c b/tests/testgrid.c index cb79b359f7..c756158f92 100644 --- a/tests/testgrid.c +++ b/tests/testgrid.c @@ -40,7 +40,7 @@ simple_grid (void) { GtkWidget *window; GtkWidget *grid; - GtkWidget *child; + GtkWidget *test1, *test2, *test3, *test4, *test5, *test6; window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window), "Orientation"); @@ -50,17 +50,28 @@ simple_grid (void) gtk_grid_set_column_spacing (GTK_GRID (grid), 5); gtk_grid_set_row_spacing (GTK_GRID (grid), 5); - gtk_container_add (GTK_CONTAINER (grid), test_widget ("1", "red")); - gtk_container_add (GTK_CONTAINER (grid), test_widget ("2", "green")); - gtk_container_add (GTK_CONTAINER (grid), test_widget ("3", "blue")); - child = test_widget ("4", "green"); - gtk_grid_attach (GTK_GRID (grid), child, 0, 1, 1, 1); - gtk_widget_set_vexpand (child, TRUE); - gtk_grid_attach_next_to (GTK_GRID (grid), test_widget ("5", "blue"), child, GTK_POS_RIGHT, 2, 1); - child = test_widget ("6", "yellow"); - gtk_grid_attach (GTK_GRID (grid), child, -1, 0, 1, 2); - gtk_widget_set_hexpand (child, TRUE); - + test1 = test_widget ("1", "red"); + gtk_container_add (GTK_CONTAINER (grid), test1); + test2 = test_widget ("2", "green"); + gtk_container_add (GTK_CONTAINER (grid), test2); + test3 = test_widget ("3", "blue"); + gtk_container_add (GTK_CONTAINER (grid), test3); + test4 = test_widget ("4", "green"); + gtk_grid_attach (GTK_GRID (grid), test4, 0, 1, 1, 1); + gtk_widget_set_vexpand (test4, TRUE); + test5 = test_widget ("5", "blue"); + gtk_grid_attach_next_to (GTK_GRID (grid), test5, test4, GTK_POS_RIGHT, 2, 1); + test6 = test_widget ("6", "yellow"); + gtk_grid_attach (GTK_GRID (grid), test6, -1, 0, 1, 2); + gtk_widget_set_hexpand (test6, TRUE); + + g_assert (gtk_grid_get_child_at (GTK_GRID (grid), 0, -1) == NULL); + g_assert (gtk_grid_get_child_at (GTK_GRID (grid), 0, 0) == test1); + g_assert (gtk_grid_get_child_at (GTK_GRID (grid), 1, 0) == test2); + g_assert (gtk_grid_get_child_at (GTK_GRID (grid), 0, 1) == test4); + g_assert (gtk_grid_get_child_at (GTK_GRID (grid), -1, 0) == test6); + g_assert (gtk_grid_get_child_at (GTK_GRID (grid), -1, 1) == test6); + g_assert (gtk_grid_get_child_at (GTK_GRID (grid), -1, 2) == NULL); gtk_widget_show_all (window); } -- 2.30.2